package com.homework.phase1.module3;

import java.util.*;
// 使用集合实现斗地主游戏的部分功能，要求如下：
// （1）首先准备 54 张扑克牌并打乱顺序。
// （2）由三个玩家交替摸牌，每人 17 张扑克牌，最后三张留作底牌。
// （3）查看三个玩家手中的扑克牌和底牌。
// （4）其中玩家手中的扑克牌需要按照大小顺序打印，规则如下：
//    手中扑克牌从大到小的摆放顺序：大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3
public class PlayPoker {
    public static void main(String[] args) {
        //创建map集合放置整桌扑克
        Map<Integer,String> poker = new HashMap<>();

        //创建String数组代表扑克点数
        String[] point = {"2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3"};

        //创建String数组代表扑克花色
        String[] suit = {"草花", "梅花", "红心", "方片"};

        //用于记录卡编号，为后续打乱牌顺序做铺垫
        List<Integer> cardNum = new ArrayList<>();

        //先将大小王手动放入poker集合的最前方两张
        poker.put(0,"大王");
        poker.put(1,"小王");
        cardNum.add(0);
        cardNum.add(1);

        //作为插入时的，不同片的编号，即poker集合的key
        int index = 2;
        //对两个String数组进行双重循环，插入poker集合，外循环为点数，控制插入的顺序，内循环为花色，控制插入的点数的花色
        for (String s: point) {
            for (String s1: suit) {
                poker.put(index,s1+s);
                cardNum.add(index);
                index++;
            }
        }
//        System.out.println(poker);
//        System.out.println(cardNum);
        //打乱扑克牌编号
        Collections.shuffle(cardNum);
//        System.out.println(cardNum);

        //创建四个list集合用于放置各玩家和底牌的扑克牌编号
        List<Integer> player1 = new ArrayList<>();
        List<Integer> player2 = new ArrayList<>();
        List<Integer> player3 = new ArrayList<>();
        List<Integer> bottomCard = new ArrayList<>();

        //将扑克牌编号交替添加到各玩家的集合中，当牌还剩52张时，放入底牌的集合作为底牌
        for (int i = 0; i < cardNum.size(); i++) {

            if (i >= 51) {

                bottomCard.add(cardNum.get(i));

                //通过对卡牌编号集合的长度进行除余，进行交替添加
            }else if (i % 3 == 0) {

                player1.add(cardNum.get(i));

            }else if (i % 3 == 1) {

                player2.add(cardNum.get(i));

            }else if (i % 3 == 2) {

                player3.add(cardNum.get(i));

            }
        }
//        System.out.println(player1+","+player1.size());
//        System.out.println(player2+","+player1.size());
//        System.out.println(player3+","+player1.size());
//        System.out.println(bottomCard);


        showCard("玩家1",player1,poker);
        showCard("玩家2",player2,poker);
        showCard("玩家3",player3,poker);
        showCard("底牌",bottomCard,poker);


    }
    //创建静态方法，在类加载时同时加载该方法。
    //展示各自的卡牌方法
    public static void showCard(String name, List<Integer> player, Map<Integer,String> poker){
        //卡牌排序
        Collections.sort(player);
        //打印各玩家名称
        System.out.print(name+"：");
        //将玩家和底牌集合内的卡牌编号与poker集合的key进行匹配，取得该key的value值
        for (Integer i:player){

            System.out.print(poker.get(i) + " ");

        }
        System.out.println();
    }
}
